package zengqiang.day02

//递归如果层级太复杂，内存占用会很大，最终会抛出，栈内存溢出的异常

// 尾递归：函数在调用自身之后，没有进行其他任何操作就是尾递归
//尾递归优化的核心原理就是：递归转成迭代
fun main(args: Array<String>) {
    println(fact1(10))
    println(fact2(100000))//705082704
}
//普通递归
fun fact1(i:Int):Int{
    if (i==1){
        return 1
    }else{
        return i+ fact1(i-1)
    }
}

/**
 * 尾递归优化
 * 1.加上tailrec
 * 2.函数在调用自身之后不进行其他任何操作
 */
tailrec fun fact2(i:Int,result:Int=0):Int{
    if (i==1){
        return result+1
    }else{
        return fact2(i-1,result+i)
    }
}